package common

import (
	"fmt"
	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"os"
	"time"
	"wish_go/src/main/com/ajie/model"
)

var DB *gorm.DB

// 初始化数据库
func InitDb() {
	username := viper.GetString("datasource.username")
	password := viper.GetString("datasource.password")
	url := viper.GetString("datasource.url")
	driverUrl := fmt.Sprintf("%s:%s%s", username, password, url)

	slowLogger := logger.New(
		//将标准输出作为Writer
		log.New(os.Stdout, "\r\n", log.LstdFlags),
		logger.Config{
			//设定慢查询时间阈值为1ms
			SlowThreshold: 1 * time.Microsecond,
			//设置日志级别，只有Warn和Info级别会输出慢查询日志
			LogLevel: logger.Info,
			// 控制台彩色sql
			Colorful: true,
		})
	db, err := gorm.Open(mysql.Open(driverUrl), &gorm.Config{
		Logger: slowLogger,
	})
	if err != nil {
		panic("数据库连接错误：" + err.Error())
	}
	defer func() {
		sqlDB, err1 := db.DB() //连接池
		if err1 != nil {
			panic("连接池配置异常：" + err1.Error())
		}
		// SetMaxIdleConns 用于设置连接池中空闲连接的最大数量。
		sqlDB.SetMaxIdleConns(10)

		// SetMaxOpenConns 设置打开数据库连接的最大数量。
		sqlDB.SetMaxOpenConns(100)

		// SetConnMaxLifetime 设置了连接可复用的最大时间。
		sqlDB.SetConnMaxLifetime(time.Hour)
	}()
	_ = db.AutoMigrate(&model.User{})
	_ = db.AutoMigrate(&model.Carousel{})
	_ = db.AutoMigrate(&model.Activity{})
	_ = db.AutoMigrate(&model.Area{})
	_ = db.AutoMigrate(&model.Wish{})
	DB = db
}

func GetDB() *gorm.DB {
	return DB
}
